#include <iostream>
#include <memory>
// 2

class Test
{
public:
    Test()
    {
        std::cout << "构造函数\n";
    }
    ~Test()
    {
        std::cout << "析构函数\n";
    }
    void show()
    {
        std::cout << "herlloword" << std::endl;
    }
};

// template <typename T>
// class SmartPoint
// {
// public:
//     SmartPoint(T *p) : p(p)
//     {
//         count++;
//     };
//     ~SmartPoint()
//     {
//         count--;
//         if (count == 0)
//             delete p;
//     }

// private:
//     T *p;
//     static int count; // 计数，每多一个指针，加1  实际应该一个指针配一个count
// };

using  TestPtr = std::shared_ptr<Test>;
int main()
{
    // std::shared_ptr<Test> p = std::make_shared<Test>();
    // p->show(); // 也重载了指针运算符
    // std::shared_ptr<Test> p2 = p;
    // p2->show();
    // std::shared_ptr<Test> p3;
    // p3 = p;
    // p3->show();

    // // 当不再有指针指向这块内存时，释放内存
    // std::cout << p.use_count() << std::endl; // 引用计数器:当前有多少指针指向该内存

    Test *t = new Test;  // 裸指针
    // std::shared_ptr<Test> p(t);
    // std::shared_ptr<Test> p1(t); 这种不可以
   // std::shared_ptr<Test> p1(p); // 这种可以
    // 共享只能发生在智能指针之间 裸指针赋值智能指针不能共享

    // 裸指针和智能指针不能混用
    
    std::shared_ptr<Test> p = std::make_shared<Test>();
    p.get(); // 拿裸指针的

    // using  TestPtr = std::shared_ptr<Test>; // 
    // TestPtr p;// 要用就用到底

    // TestPtr p = std::make_shared<Derived>(); // 智能指针支持多态
    // dynamic_cast<Derived*>(p.get());
    return 0;
}
